package ACM;

import java.util.Arrays;
import java.util.Scanner;

/**
 * 球队比分
 * 时间限制： 3000MS
 * 内存限制： 589824KB
 * 题目描述：
 * 有三只球队，每只球队编号分别为球队1，球队2，球队3，这三只球队一共需要进行 n 场比赛。
 * 现在已经踢完了k场比赛，每场比赛不能打平，踢赢一场比赛得一分，输了不得分不减分。
 * 已知球队1和球队2的比分相差d1分，球队2和球队3的比分相差d2分，每场比赛可以任意选择两只队伍进行。
 * 求如果打完最后的 (n-k) 场比赛，有没有可能三只球队的分数打平。
 * <p>
 * <p>
 * <p>
 * 输入描述
 * 第一行包含一个数字 t (1 <= t <= 10) 接下来的t行每行包括四个数字 n, k, d1, d2(1 <= n <= 10^12; 0 <= k <= n, 0 <= d1, d2 <= k)
 * <p>
 * 输出描述
 * 每行的比分数据，最终三只球队若能够打平，则输出“yes”，否则输出“no”
 * <p>
 * <p>
 * 样例输入
 * 2
 * 3 3 0 0
 * 3 3 3 3
 * 样例输出
 * yes
 * no
 * 例子说明1:
 * case1: 球队1和球队2 差0分，球队2 和球队3也差0分，所以可能的赛得分是三只球队各得1分
 * case2: 球队1和球队2差3分，球队2和球队3差3分，所以可能的得分是 球队1得0分，
 * 球队2得3分, 球队3 得0分，比赛已经全部结束因此最终不能打平。
 */
class Soccer {
    /**
     * The entry point of application.
     *
     * @param args the input arguments
     */
    public static void main(String[] args) {
        Scanner scanner = new Scanner(System.in);
        int t = scanner.nextInt();
        while(t-->0){
            long n = scanner.nextLong();
            long k = scanner.nextLong();
            long d1 = scanner.nextLong();
            long d2 = scanner.nextLong();
            if(check(n,k,d1,0,d2)||check(n,k,-d1,0,-d2)||check(n,k,d1,0,-d2)||check(n,k,-d1,0,d2)){
                System.out.println("yes");
            }else{
                System.out.println("no");
            }
        }
    }

    /**
     * Check boolean.
     * 已队伍2 为基准
     *
     * @param n  the n场比赛
     * @param k  the 踢了k场
     * @param t1 the t 1 队伍1分数
     * @param t2 the t 2 队伍2分数
     * @param t3 the t 3 队伍3分数
     * @return the boolean
     */
    static boolean check(long n, long k, long t1, long t2, long t3){
        //k表示 已经得到的总分数，  t1+t2+t3代表当前总分数，
        if((k-t1-t2-t3)%3!=0 ){
            return false;
        }

        return true;


    }
}
